package common

import (
	"fmt"
	"net"
	"time"
)

// 判断指定ip和端口是否可以连接
func Telnet(ip string, port int) bool {
	timeout := time.Second * 5 // 设置连接超时时间为5秒
	conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", ip, port), timeout)
	if err != nil {
		return false // 连接失败，返回false
	}
	defer conn.Close()
	return true // 连接成功，返回true
}

// 查看指定ip或域名是否可以ping通
func Ping(ip string) bool {
	timeout := time.Second * 5 // 设置连接超时时间为5秒
	conn, err := net.DialTimeout("ip4:icmp", ip, timeout)
	if err != nil {
		return false // 连接失败，返回false
	}
	defer conn.Close() // 确保在函数结束时关闭连接
	return true        // 连接成功，返回true
}

// 获取本地实际ip ,可能会有多个,因为可能有多个网卡
func GetLocalIp() []string {
	// 获取本地网络接口列表
	interfaces, err := net.Interfaces()
	if err != nil {
		panic(err)
	}

	var ips []string
	// 遍历网络接口，查找非环回和非点对点接口的实际IP地址
	for _, iface := range interfaces {
		if iface.Flags&net.FlagUp == 0 {
			continue // 接口未启用，跳过
		}
		if iface.Flags&net.FlagLoopback != 0 {
			continue // 环回接口，跳过
		}
		if iface.Flags&net.FlagPointToPoint != 0 {
			continue // 点对点接口，跳过
		}
		addrs, err := iface.Addrs()
		if err != nil {
			continue
		}
		for _, addr := range addrs {
			var ip net.IP
			switch v := addr.(type) {
			case *net.IPNet:
				ip = v.IP
			case *net.IPAddr:
				ip = v.IP
			}
			if ip == nil || ip.IsLoopback() {
				continue
			}
			ip = ip.To4() // 只关心IPv4地址，如果需要IPv6可以相应修改
			if ip != nil {
				ips = append(ips, ip.String())
			}
		}
	}
	return ips
}

// 获取本机mac地址
func GetLocalMac() string {
	interfaces, err := net.Interfaces()
	if err != nil {
		panic(err)
	}
	for _, iface := range interfaces {
		if iface.Flags&net.FlagUp == 0 {
			continue // 接口未启用，跳过
		}
		if iface.Flags&net.FlagLoopback != 0 {
			continue // 环回接口，跳过
		}
		if iface.Flags&net.FlagPointToPoint != 0 {
			continue // 点对点接口，跳过
		}
		return iface.HardwareAddr.String()
	}
	panic("没有找到本地mac地址")
}

// 获取域名的实际ip
func GetDomainRealIp(domain string) string {
	ips, err := net.LookupIP(domain)
	if err != nil {
		panic(err)
	}
	for _, ip := range ips {
		if ip.To4() != nil {
			return ip.String()
		}
	}
	panic("没有找到域名的ip")
}
